import { login, getInfo, getDetailInfo } from '@/api/user'
import { getToken, setToken, removeToken } from '@/utils/auth'
// import { resetRouter } from '@/router'
// import { turn } from 'core-js/core/array'

const getDefaultState = () => {
  return {
    token: getToken(),
    name: '',
    avatar: '',
    userInfo: null // 保存用户信息的
  }
}
const state = getDefaultState()
const mutations = {
  RESET_STATE: (state) => {
    Object.assign(state, getDefaultState())
  },
  SET_TOKEN: (state, token) => {
    state.token = token
  },
  SET_NAME: (state, name) => {
    state.name = name
  },
  SET_AVATAR: (state, avatar) => {
    state.avatar = avatar
  },
  // 获取用户信息
  userInfo(state, payload) {
    if (state.userInfo) {
      // 有值就将俩次请求回来的数据合并到一个对象中
      state.userInfo = {
        ...state.userInfo,
        ...payload
      }
    } else {
      state.userInfo = payload // 第一次发请求将请求回来的数据保存在state中
    }
  },
  //  将个人信息删除
  clearInfo(state) {
    state.userInfo = null
  }
}
const actions = {
  // user login 登录模块
  async login({ commit }, userInfo) {
    const { username, password } = userInfo
    // 使用 async  await 回掉函数
    const ret = await login({ mobile: username.trim(), password: password })
    if (ret.code === 10000) {
      commit('SET_TOKEN', ret.data)
      setToken(ret.data)
      // 使用promise封装就是使用promises身上的属性发方法then catch
      // 成功的返回的状态此处将返回值写
      return Promise.resolve(true)
    } else { // 失败返回的状态
      return Promise.reject(false)
    }
    // return new Promise((resolve, reject) => {
    //   login({ username: username.trim(), password: password }).then(response => {
    //     const { data } = response
    //     commit('SET_TOKEN', data.token)
    //     setToken(data.token)
    //     resolve()
    //   }).catch(error => {
    //     reject(error)
    //   })
    // })
  },
  // 获取用户信息
  async getInfo({ commit, state }) {
    // 发送请求哈
    const res = await getInfo()
    if (res.code === 10000) {
      commit('userInfo', res.data)
    }
  },
  // 获取用用户头像                   注意俩次共用的是个commit函数 操作的是state中的同一个对象
  async getDetailInfo({ commit }, id) {
    const res = await getDetailInfo(id)
    if (res.code === 10000) {
      commit('userInfo', res.data)
    }
  },
  // 退出
  logout({ commit }) {
    // 清空token哈
    commit('SET_TOKEN', '')
    // 还有就会清空用户信息
    commit('clearInfo')
    // 最后将本地缓存中的cookise也删除
    removeToken()
  },
  // logout({ commit, state }) {
  //   return new Promise((resolve, reject) => {
  //     logout(state.token).then(() => {
  //       removeToken() // must remove  token  first
  //       resetRouter()
  //       commit('RESET_STATE')
  //       resolve()
  //     }).catch(error => {
  //       reject(error)
  //     })
  //   })
  // },

  // remove token
  resetToken({ commit }) {
    return new Promise(resolve => {
      removeToken() // must remove  token  first
      commit('RESET_STATE')
      resolve()
    })
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}

